package pr2012.practico4.grafos;

public class TVertice {
	private TLista adyacentes = new TLista();
	public boolean visitado;
	public Comparable etiqueta;
	
	public TVertice(Comparable etiqueta) {
		this.etiqueta = etiqueta;
		adyacentes = new TLista();
		visitado = false;
	}
	
	public TVertice primerAdyacente() {
		if (this.adyacentes.primero != null){
			if (this.adyacentes.primero.datos != null){
				TAdyacente ady = (TAdyacente)this.adyacentes.primero.datos;
		        return ady.destino;
			}
		}
		return null;
	}
	
    public TVertice siguienteAdyacente (TVertice vertice) {
        if (vertice != null){
                TElemento elem = this.adyacentes.buscarEtiqueta(vertice.etiqueta);
                if (elem != null){
                        TAdyacente ady = (TAdyacente)elem.datos;
                        if (ady != null){
                                if (elem.siguiente != null){
                                        ady = (TAdyacente) elem.siguiente.datos;
                                        if (ady != null){
                                                return ady.destino;
                                        }
                                        return null;
                                }
                        }else{
                                return null;
                        }
                }
        }
        return null;
}

	
	public Comparable obtenerCostoAdyacencia(TVertice destino){
		TElemento elem = this.adyacentes.buscarEtiqueta(destino.etiqueta);
		if (elem != null){
			TAdyacente ady = (TAdyacente) elem.datos;
			return ady.costo;
		}
		return null;
	}
	
	public boolean insertarAdyacencia(TVertice destino, Comparable costo){		
		TAdyacente ady = new TAdyacente(destino, costo);
        return this.adyacentes.insertarAlFinal(new TElemento (ady.destino.etiqueta,ady));
	}
	
	public boolean eliminarAdyacencia(Comparable nomVerticeDestino) {
		return this.adyacentes.eliminarEtiqueta(nomVerticeDestino);
	}
	
	public TElemento buscarAdyacencia(Comparable unaEtiqueta){
		TElemento ady = this.adyacentes.buscarEtiqueta(unaEtiqueta);
        return (TElemento) ady;
	}
	
	public TRecorrido bpf(TRecorrido recorrido){
		this.visitado = true;
		recorrido.insertarAlFinal(new TElemento(this.etiqueta, this));
		TVertice otroVertice = this.primerAdyacente();
		while (otroVertice != null)
		{
			if(!otroVertice.visitado)
			{
				TRecorrido copia=recorrido;
				recorrido= otroVertice.bpf(copia);
			}
			otroVertice = this.siguienteAdyacente(otroVertice);
		}
		return recorrido;
	}
	public TRecorrido bea(TRecorrido recorrido, TLista cola){
		this.visitado=true;
		recorrido.insertarAlFinal(new TElemento(this.etiqueta, this));
		cola.insertarAlPrincipio(new TElemento(this.etiqueta, this));
		while (!cola.esVacia()){
			TElemento p=cola.quitarPrimero();
			TVertice actual=this.siguienteAdyacente((TVertice)p);
			while (actual!=null){
				if (actual.visitado=false){
					actual.bea(recorrido, cola);
				}
			}
		}
		return recorrido;
	}
}











